use std::{collections::HashMap, sync::Mutex};

use once_cell::sync::Lazy;
mod calc;
mod exp;
pub (crate) use exp::parse_calc_exp;

type ConvFunc= for<'a> fn(Vec<&'a str>) -> anyhow::Result<String>;

static CONV_FUNC_MAP: Lazy<Mutex<HashMap<String, ConvFunc>>> = Lazy::new(|| {
    let mut map = HashMap::new();
    let f1:ConvFunc=calc::get_perd;
    let f2:ConvFunc=calc::modify_comp_clie_name;
    let substr:ConvFunc=calc::substr;
    let get_clie_type_by_no:ConvFunc=calc::get_clie_type_by_no;
    let if_empty:ConvFunc=calc::if_empty;
    let remove_tail_letters:ConvFunc=calc::remove_tail_letters;
    map.insert("get_perd".to_string(), f1);
    map.insert("modify_comp_clie_name".to_string(), f2);
    map.insert("substr".to_string(), substr);
    map.insert("get_clie_type_by_no".to_string(), get_clie_type_by_no);
    map.insert("if_empty".to_string(), if_empty);
    map.insert("remove_tail_letters".to_string(), remove_tail_letters);
    Mutex::new(map)
});
pub fn get_conv_func(name: &str) -> Option<ConvFunc> {
    let map = CONV_FUNC_MAP.lock().unwrap();
    map.get(name).cloned()
}
